输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。
数据范围:,数组中每个数的值
要求:时间复杂度 ,空间复杂度
[1,2,3,4]
[1,3,2,4]
[3,1,2,4]或者[3,1,4,2]也是正确答案
[1,3,5,6,7]
[1,3,5,7,6]
[3,1,5,7,6]等也是正确答案
[1,4,4,3]
[1,3,4,4]
class Solution: def reOrderArrayTwo(self , array: List[int]) -> List[int]: left=0 right=len(array)-1 while left<right: while left<right and array[left]%2==1: left+=1 while left<right and array[right]%2==0: right-=1 array[left], array[right] = array[right], array[left] left+=1 right-=1 return array
class Solution: # 双指针对撞(不能保证相对位置不变) # 时间复杂度:O(n) 空间复杂度:O(1) def reOrderArrayTwo(self , array: List[int]) -> List[int]: i = 0 j = len(array) - 1 while i < j: if (array[i] % 2) and not (array[j] % 2): # 前奇后偶 i += 1 j -= 1 elif (array[i] % 2) and (array[j] % 2): # 前奇后奇 i += 1 elif not (array[i] % 2) and not (array[j] % 2): # 前偶后偶 j -= 1 else: # 前偶后奇 array[i], array[j] = array[j], array[i] i += 1 j -= 1 return array
class Solution: # 双指针 + 新的数组 # 时间复杂度:O(n) 空间复杂度:O(1) def reOrderArrayTwo(self , array: List[int]) -> List[int]: n = len(array) res = [0 for i in range(n)] odd = 0 for i in array: if i % 2: odd += 1 x = 0 y = odd for a in array: if a % 2: res[x] = a x += 1 else: res[y] = a y += 1 return res
class Solution: def reOrderArrayTwo(self , array: List[int]) -> List[int]: i_even, i_odd = 0, len(array) - 1 while i_even < i_odd: if array[i_even] % 2 == 0: while i_odd > i_even: if array[i_odd] % 2 == 1: array[i_even], array[i_odd] = array[i_odd], array[i_even] break i_odd -= 1 i_even += 1 return array
class Solution: def reOrderArrayTwo(self , array: List[int]) -> List[int]: # write code here # 双指针, 前指针只找偶数, 后指针只找奇数, 找到后互换。 i = 0 j = len(array) - 1 while i < j: a = array[i] b = array[j] if b % 2 == 1 and a % 2 == 0: array[i], array[j] = array[j], array[i] i+=1 j-=1 continue if b % 2 == 0: j-=1 if a % 2 == 1: i+=1 return array
class Solution: def reOrderArrayTwo(self , array: List[int]) -> List[int]: # write code here i=0 j=len(array)-1 while i<j: if array[i]%2==0 and array[j]%2!=0: array[i],array[j]=array[j],array[i] i+=1 j-=1 elif array[i]%2!=0 and array[j]%2==0: i+=1 j-=1 elif array[i]%2==0 and array[j]%2==0: j-=1 elif array[i]%2!=0 and array[j]%2!=0: i+=1 return array